The most obvious implementation is to write a cooperative multitasking system whereby when one application has finished doing stuff with the CPU, it calls some kind of yield function, or calls a wait for message function.
In the implementation of that you then have to switch to another task if necessary - possibly by calling setjmp() and longjmp() to save the stack and the cpu context (Assuming this is in C)
Otherwise you'll have to switch stack and save the CPU context manually, which will be CPU specific and may involve assembly language.
Once you've figured out which process needs to run you can then call longjmp() back to the context of that process, and continue it from where it left off. ect.....
On the other hand I would not suggest a DOS ......It sounds like a fun project, but it seems to me that people doing these kinds of projects are building desktop environments/GUI's not an operating systems. With that said, if I may make a suggestion, try using a MACH base rather than a DOS base. Remember the whole system is limited by the functionality of the
kernel, plus
MACH will just make a lot of things much easier on account of it's messaging system being, well actually existing.

This will enable you to not only easily develop software for it, but also to easily extend its functionality.
Make any sense?