Getting nice-looking joints that work at all angles is the hard part of this game. To start, I'd recommend minimizing the number of vertices right at the joint. For the parts of your model that stay fairly static you can load up as much detail as your system can handle, but at the joints the fewer points you can get away with the easier your life becomes.
Another common issue with the shoulder (even amongst professionals) is to place too much emphasis on the upper arm bone, and not enough on the clavicle. You will notice that if you keep your collar bone down you can't raise your upper arm much more than parallel with the ground. The same is true with your modelling: if you spread extremely high motions of the upper arm over both bones you will significantly lessen, but not entirely remove, the difficulty of getting uniform volume in the joint.
The last thing is to bias the shoulder opening on the body and the upper arm to favour a forward motion with the arm, since the arm rarely goes very far backwards. I hope that makes sense, as it's a bit hard to describe. Basically if your body was a rectangle and your arm was a rectangle coming out of the side, then where they meet the back vertices go out to the side more than the front vertices do, and you will keep more volume in the shoulder as the arm swings forward.
As I said, it's tricky but hopefully this will at least get you started. And I, by no means, consider myself an expert on the subject. There should be some tutorials out there on the web, somewhere, as this is a very common problem.