A shell is a special kind of program which sits between the user and the operating system. It takes requests from the user, and passes them onto the operating system to be acted upon. Some operating systems only have a single shell:
Most versions of UNIX (including Linux) have many different shells available. The user is to some extent able to pick the shell that works best for them. In addition, some shells are better for certain tasks than other shells. For this reason, most shell scripts (batch programs in MS-DOS parlance) are written for something called the Bourne shell (sh), but users are more or less free to use sh, csh, ksh, bash, tcsh, ...as their ``interactive'' shell.
It has been mentioned that there might be a difference between a shell and a windowing environment. Personally, I don't think there is. A shell is a construction which interprets a users actions (I want to run program X) and passes the request onto the kernel. In this regard, a windowing environment and a shell a very similar.