Receiving MSMQ messages as a list
You create a lot of TimeSpan objects which is unnecessary. Just create one timeout variable. Especially since it's used in multiple places. This makes changing the timeout later easier. Otherwise you are bound to forget one place.
Prefer TimeSpan.FromXYZ() methods. They makes it more obvious for what period you create a TimeSpan.
Consider moving the mail sending code into its own function which just accepts a single message and sends it.
It might make sense to iterate over the message queue directly instead of buffering them all up:

var timeout = TimeSpan.FromSeconds(1);
var queueIter = msgQueue.GetMessageEnumerator2();
while (queueIter.MoveNext(timeout))
{
    using (var message = msgQueue.ReceiveById(queueIter.Current.Id, timeout))
    {
        SendMessage(message);
    }
}

Instead of directly sending the message consider making an event available on the class like MessageReceived. Then other code can subscribe to it and do stuff (like sending it as mail or logging it or saving it somewhere, etc).
As mentioned in the comment you should wrap all objects you create which are IDisposable into using statements to make sure any allocated resources are cleaned up properly.