I'll start saying this is a controversial topic.
My personal take is you should identify significantly different resolution/sizes ranges and provide a different UI layer you can swap in when you detect a resize that goes from one range to the other (dynamically switching might not even be a requirement for you - in that case you just check at load time). This approach obviously doesn't make sense if the ranges you identify are very limited and similar to each other, as within the same range your app should be able to resize decently.
Trying to tackle all the possible resolutions with the same UI layer might sound like a great idea but it can be a recipe for disaster. You might get it working, but you'll very likely end-up with a ball of string, with a bunch of IF-ELSE and SWITCH statements looking at pixel sizes, resizing controls and moving things around.
If you think about it, Google Maps (for one, but think about any iPhone app) doesn't serve the same UI on mobile and on your desktop browser and so forth. If that's the difference in size we're talking about (mobile VS desktop-like resolutions) then you'll have to roll different UI layers as per my suggestion above.
The holy grail is the so called Liquid Layout - WPF could help on this but since you're on compact framework that's ruled out.
I recently asked a very similar question - you can have a look at it here if you wanna read different opinions.