Both PWM and MPPT controllers are essentially switched mode, DC-to-DC power converters, that step down a high voltage from the solar panel side to match the charging requirements of a lower voltage battery pack.
Both employ a pair of transistors that will connect and disconnect the solar panel to the battery with a fixed frequency (50 Hz for our PWM controller, up to tens of KHz for some MPPT controllers). The charging voltage is being regulated by varying the duty cycle of the periodic signal that controls the switching transistors. A duty cycle of 100% means that the switches always stay closed (e.g, in a condition of low solar voltage or low battery power, where we need the last drop of solar energy); whereas a duty cycle of 0% means that the switches stay permanently open, e.g if the battery is completely full, the load is turned off and we don't need any solar power.
The first obvious difference about an MPPT controller is that it employs a very efficient low-pass filter on its output towards the battery (with a rather big inductor), that mostly limits the voltage ripple so we can get cleaner output power. It can said that we can afford to skip this filtering within a PWM controller, as the battery itself acts as a very big capacitor suppressing the switching transients, so the load will not be disturbed.
But because of this inductor, an MPPT controller will also be able to better manage the current draw from the solar panel in order to keep the panel operating at its maximum power point.
A solar panel is a highly non-linear device, with a power characteristic (or current-voltage curve, I-V curve) that looks like a seated person's leg (see blue line below):
(Licensed under Creative Commons Share Alike, source https://commons.wikimedia.org/wiki/File:I-V_Curve_MPP.png)
The idea is that instead of drawing the PV voltage down to battery voltage on each switching cycle (towards the left of the graph above), by drawing the highest current we can get, we should limit the current slightly, so the solar panel voltage stays roughly at the knee of the graph, where the power P = V * I is maximum.
An MPPT controller is also capable of tracking on-line the variations with temperature and solar irradiance of the graph above, which results in fact in a family of curves for which we need to 'stay on the knee' for maximum power harvesting:
A PWM controller will mostly draw close to short circuit current from the solar panel, which will correspond to a reduced solar panel voltage, thus leading to low power harvesting. The solar charging efficiency of a PWM controller increases with increasing battery voltage (as we are moving towards maximum power point) and it is worse with very low battery voltage or with very high panel voltages.
Therefore for a PWM controller it is important to properly match the solar panel array voltage to the battery voltage, to keep the battery side closer to the solar panel's knee voltage.
The upside of a PWM controller is that it is much less expensive than an MPPT controller, has less EMC issues due to the absence of large inductors and if the battery is properly matched with a solar panel array of corresponding voltage, the losses can be insignificant most of the time.