I wrote a DOS shell -- GUI, but character-mode-based -- that fit on two 360kb floppies (or one 720K floppy) for distribution.
It included a DOS menuing system, a GUI configuration program (for creating your DOS app menu entries), a graphical file manager (including a full licenced copy of PKZIP/UNZIP, with a GUI frontend I wrote), and an "in-program" cooperative multitasker (for maintaining the on-screen clock display and animated background).
It also included a Windows 3.x component that I wrote, to allow you to run Windows apps from DOS. My shell would launch Windows, run the selected application, and then sit silently in the background, monitoring your app. When you closed your app, my code would terminate Windows, and put you back in the DOS shell. (It also had options to stay in Windows when your app ended, or, query you as to whether to remain in Windows or return to DOS.) I added that because at that time, many people didn't have a lot of Windows apps, and only went into Windows for the express purpose of running a single program, and they'd go back to DOS when they were done.
Yes, you could do a lot in a little bit of space back then. (Both disk space, and RAM. My shell worked on computers with 640 KB RAM.)
I gave up on my shell when Windows 95 came out and I could see the handwriting on the wall. I'd had a distributor all lined up, too, hot to start publishing it, too. Timing is everything, argh.