Shells are the interactive programs that run in text terminals and let you execute commands and run external programs. But, shells can be used non-interactively and you can write scripts and execute (source) them like regular programs. System administrators live and die by the command-line. Unix evolved as text-based environment and for a long time shells were a central part of the user experience and the graphic UI evolved significantly later. On Windows the user experience was focused from the beginning on graphic UI (It’s not called Windows for nothing). Unix/Linux shells, such as Bash, are very good at manipulating text and chaining together (piping) the text output of small commands to the input of other commands.
On Windows, the original textual shell and batch language (command.com?and later cmd.exe) were significantly inferior. But, Microsoft saw the light and developed PowerShell, which is indeed very powerful and arguably exceeds the capabilities of the Unix shells. For a long time, the two camps were pretty separate. You could run some variation of Unix shells on Windows via cygwin or similar, but it was mostly used for special purposes. PowerShell was definitely a Windows-only affair. But, things are changing.
Microsoft is blending the boundaries. First, Microsoft made PowerShell available?on Linux and Mac OSX and then it brought Bash to Windows by way of having Ubuntu on Windows. Those are all exciting developments for shell nerds and will pave the way for stronger and more streamlined integrations between *Nix and Windows environments. Developers will be able to work in their favorite environment and will have fewer problems debugging production issues on various platforms.