From the Offensive Security Metasploit Unleashed website:
Meterpreter is an advanced, dynamically extensible payload that
uses in-memory DLL injection stagersand is extended over the network
at runtime. It communicates over the stager socket and provides a
comprehensive client-side Ruby API. It features command history, tab
completion, channels, and more.
More details from the original specification:
Abstract: Meterpreter, short for The Meta-Interpreter, is an advanced
payload that is included in the Metasploit Framework. Its purpose is
to provide complex and advanced features that would otherwise be
tedious to implement purely in assembly. The way that it accomplishes
this is by allowing developers to write their own extensions in the
form of shared object (DLL) files that can be uploaded and injected
into a running process on a target computer after exploitation has
occurred. Meterpreter and all of the extensions that it loads are
executed entirely from memory and never touch the disk, thus allowing
them to execute under the radar of standard Anti-Virus detection.
At a high level, meterpreter looks similar to a typical command
interpreter. It has a command line and a set of commands that can be
run. The most visible difference is that the meterpreter client can
control the set of commands by injecting new extensions on the fly.
Since the extensions can potentially be applicable across
architectures and platforms, the meterpreter client can use the same
client interface (and command set) to control the extensions
So, you can think of it as an extensible command shell that provides the same interface across platforms. It injects itself to an existing process on the target and usually doesn't spin off new processes. Some of the built-in commands allow for uploading/downloading files, and setting up port forwarding through the target. Meterpreter also supports encrypted communication. You can read more at the previous links.
A "system shell" has much less in terms of features, except what you already get through shell commands. A user could notice your shell or it's child processes running on target. There may not be encryption unless you have set it up yourself. Uploading/downloading files may be limited to copy and paste.