Can't we create our own drivers ?
well you
can but it's generally agreed that you would need to know what your doing. Any error caused by a driver will cause a kernel mode BSOD (the user mode fault dialog is the same thing as a BSOD, but since it was user mode code it was recoverable)
(windows for example would use the DDK and any stdcall capable language)
How the drivers interact with the hardware ?
This depends on the platform. many platforms implement a "hardware abstraction layer" which virtualizes calls to hardware components. Hardware is accessed just as it always has been- through mapped memory addresses, or mapped memory. One example being to store a memory block in mapped device memory and then call a hardware interrupt; the ahrdware device interprets the memory contents and performs a task, or performs a task with that memory (such as send it out to the network).
The main difficulty with your question is the assumption that drivers are the same under any architecture and operating System. This is not so. With Linux, there are a number of different technologies that can be leveraged to write a driver; DOS is another architecture altogether; your question has a different answer for each one.