I believe the cardioid pattern is ideal for this situation and the SM58 is a very good mic for voice. Cardioids have a pickup angle of about 120 degrees which is wider than super-cardioids and figure-of-eights. The only polar pattern that is wider than the cardioid is omni-directional but this is a bad idea because you need the rejection the cardioid pattern has at 180 degrees (the back) so you can have more amplification on your PA without feedback.
This is a task for a dynamics processor and more specifically a compressor. What a compressor does is turn down the volume when the input is above a threshold level. In your case, it would turn down the volume for the loud speakers and bring their level closer to that of the ones that speak too far from the mic. Then you will be able to turn both up and as a result, make both sound louder. You will find there is a limit to what you can do with this so expect audible improvement but not a miracle.
Setting up the threshold level will take some trial and error because human voice can vary quite a bit. I think I would start with a (realistic) worst case scenario. A low voice some distance from the microphone. Look on your level meters and set it as your threshold level.
The next setting on a compressor is the ratio (of compression). This applies to any level above the threshold level. A setting of 4:1 would be a good start.
Finally you will see an 'attack' and 'release' setting. These affect how fast the compressor will react to turn down the output when the input is above the threshold level (attack) and how fast it will stop compressing when it comes back down bellow the threshold. For a voice you need medium-low attack (5-30ms)and medium release (around 250ms).
I believe this would work for most speakers except for the most careless ones.
All graphics were taken from the wikipedia article on dynamic range compression and belong to the public domain.