This is largely kind of a judgement call as to which flag you use on a given question. There's not a real hard and fast rule, but essentially:
- "Off Topic -> Development questions are off topic..." is kind of a catch-all close reason for development questions that we aren't going to handle here. It covers actual programming, publishing questions, setting up a developer account/merchant account, trying to port Android to esoteric devices X, Y and Z, etc. If a question is clearly a development topic and you think it should be closed, this is pretty much always an appropriate flag.
- "Off Topic -> Belongs on SO" is a migration feature that's basically intended to cover programming questions that are of otherwise high quality, but appear to have simply been asked on the wrong site. What makes this a judgement call is that by picking this flag, you're basically saying "Hey, this is off-topic here but I believe it would do well on Stack Overflow.
Many (honestly, probably most) dev questions asked here do not really fall into the migration category for one of a number of reasons. Often it is because the topic they're looking for help on is not actually covered on SO. Publishing questions are a good example of this - the best resource is Google's support channels, and SO usually closes questions related to publishing an app but not related to the actual programming.
Similarly, questions that are of a low-to-mediocre quality are not migrated because the golden rule of migrations is: don't migrate crap. Quality here is a little nebulous, but it could be due to very poor formatting, not having enough information (e.g "I get an error" is not specific enough for SO) or questions that are overbroad ("How do I write a music app?" is an example). Migrating a poor question is viewed as dumping more moderation work onto the receiving site, since they'll just end up closing it anyway.
Also, if you're considering flagging a post for migration because it is of decent quality, then it's often a good idea to check the user's profile to see if they've already cross-posted it to SO. A lot of new-ish users seem to do this, and migrating a duplicate is not really useful, so these will generally just be closed here.
A good rule of thumb, in my opinion: if in doubt, just pick the canned close reason. That at least gets the question into the review queue so that other people can get eyes on it as well. Plus, if someone else comes along and really thinks it should go to SO, they can still cast a migration vote even if that's not the flag you used.