In the olden days of Unix and other mainframe computers, people were usually using
"terminals" to connect to the workstations via the network or through modem connections. These terminals were just a keyboard and a monitor for text output. The terminals usually had a fixed command set for displaying text and for transmitting keyboard commands. There were a number of different command set used, e.g. for the DEC VT100 or IBM 3270 terminal.
Once you connected to the workstation through a terminal, you usually opened an interactive program, or "shell" in Unix terms. If you had a task to do that needed a longer time to finish (and 15 or 20 years ago that was quite common), you set it up as a batch job and closed the shell, so that someone else could use your terminal.
The "Terminal.app" in Mac OS, just like "Xterm" under X11, is technically an emulator for those ancient computer terminals. You can even influence some VT100 related settings in the preferences and choose which kind of shell to run.
So, historically, terminal and shell are seperate things, but nowadays we nearly always use them together.