It's fundamentally, like Gravis said, a question of What An Operating System Is. How do you define it?
The very oldest computers had no operating system. Not only that, they didn't even have anything we'd recognize as a bootloader. All they did was munch instructions that were physically wired in, via plugboard, switch panel or both. Stored program computers were the next innovation, because plugboards or just directly slam-dunking machine code into memory by switches doesn't really scale to programs that are very long at all. Instead, you wrote your machine code on punchcards, the punchcard reader - a frontend to the actual computer - slurped the machine code on the punchcards into memory and then the computer ran it. Still no OS or anything, it's all just running on bare metal.
People started to realize two things at this point:
- Computer programs often do a lot of the same things as other programs. You don't have to reinvent the wheel every time.
- If your computer has any mechanism to do this at all, keeping that shared functionality in memory and only bringing in new programs allows you to write smaller programs.
And so people started writing shared libraries of functionality, and then the operators started keeping those libraries resident. Eventually the libraries started developing their own functionality, for debugging or hardware management and soon the libraries evolved into what were called "monitors", which could manage software on their own. These were the first operating systems as we know them!
The thing to understand here is that these were mainframe programs but were still single-tasking, single-user. The mainframe operators still ran single programs (now loaded via the monitor!) in batch mode and then provided the results to the programmer.
The real big innovation next was timesharing, allowing multiple batches and multiple interactive programs to run at, from the user's perspective, the same time! This is where modern operating systems started; they supported memory management, and multiple process management. They had filesystem drivers and network subsystems. Some of these systems we use (their direct descendants) daily, most especially Unix.
So! By the late 60s/early 70s, this is what an OS really is, a full scale modern OS. You still had single-tasking systems like RT-11 that were mostly employed for realtime operations like industrial control; they didn't have process control for multitasking but they still had many of the other features including hardware abstraction, memory management, filesystem and network and other device support and the like.
Mid-70s, the first microcomputers appeared. The Altair 8800, the KIM-1 and others all emerged in the 74 to 76 period. These were full-fledged computers, not just calculators or such, but were vastly less powerful than even the smallest minicomputers that could run small OSes like RT-11, let alone the big CDC beasts or DEC's 36-bit monsters. They went through a similar evolution of operating systems, with the earliest being simple ROM-based or switch-loaded monitors, with relatively more powerful embedded BASIC environments or simple control systems built on the same architectural lines, but vastly simplified, as already simple single-tasking RTOSes like RT-11, coming along later.
The most popular of these control environments, which DOS was somewhat of a copy of, was CP/M. CP/M provided some of the functionality that would be expected of a minicomputer OS; it had filesystem drivers, and some minimal hardware abstraction, so that CP/M software (as long as the CPU was the same or compatible) written correctly could run on different computers without having to be rewritten.
DOS was different on that respect, in that it was never intended to be portable. The original 86-DOS written by Seattle Computer Products was just a quick and dirty system to run development on for an 8086 development system. When Microsoft acquired it to sell to IBM, they wrote some utilities to get a fully functional computer out of it, with some APIs to support, but that's it. The result is this:
Almost every DOS program of any complexity had to bypass it and talk to the hardware directly.
This was not a hard thing to do! DOS provided no (and so enforced no) memory management, hardware layer, process control, and so on. It had some facilities to allow well-behaved software to coexist and hooks to allow drivers to extend the OS functionality, but that was it. Quite a bit of software, especially games but also a fair number of commercial/business packages, interacted with DOS very little or not at all; some things we remember as DOS programs actually weren't but booted directly from floppies without DOS ever being started.
The upshot of this is that a lot of programs for DOS functioned, to some extent or another, as operating systems in their own right. Video card manufacturers famously provided their own graphics drivers, not for DOS, but for AutoCAD. In general, the only thing these programs used DOS for was the filesystem access, treating DOS itself as basically just a disk driver. 386 era programs that used DOS extenders (think Doom) had the DOS extender take over the system entirely, and the DOS extenders would supply basically everything a traditional OS would: Memory management, process control, sometimes a hardware abstraction layer with its own small set of drivers, only ever thunking back to DOS for (you guessed it) filesystem access. DOS itself just kind of sat and vegetated in a corner, not even running in any meaningful way unless the DOS extender invoked it.
So! Not only was Windows basically a full operating system from word go, so were a lot of other programs. Some of them were even OS-shaped and provided their own operating environment distinct from the DOS command line, like Desqview (a true multitasking, windowing system for DOS programs that was probably Windows' biggest competitor in the early days). Others were programs like AutoCAD or Doom that shoved DOS completely out of the way and took over the whole computer.
Even for the era, DOS was wimpy. "A shell on top of DOS" is verbal sleight-of-hand because DOS basically didn't do shit.