Windows DLLs are a poor man's way to link object code at run time. I'd take a look at unix shared libraries. They're quite a fair bit more extensible in my opinion (at the very least, a shared library and be linked to a shared library... which is impossible with DLLs).
Essentially, you'll need some form of object loader that'll load shared libraries on demand and keep them in memory as they're needed. This loader will maintain a list of all libraries and what functions they provide. Applications will list which shared libraries they require, and if they aren't loaded, the loader will load them, and link them at runtime.
The Linux elf format embodies all of these things (executables supporting shared libraries, and the shared libraries themselves).
For a hint at how to runtime link you can take a look at rZero.c in my kernel at
http://www.neuraldk.org (software -> ndk). This has already all been revamped and with better APIs, but I'm not ready to release that version just yet
Soon...
--Jeff