Elaborating on what was mentioned in the comments of your lincolnpixel's answer, and to provide an "official" response to why it works this way:
The correct way to specify a default is to hard code it in your template. There are a couple ways to do this. You can either specify it in your checkout tag:
{exp:store:checkout payment_method="paypal_express"}
Under the hood, this simply adds a hidden field to your template, so it's exactly the same as doing this:
<input type="hidden" name="payment_method" value="paypal_express" />
You can also template the input field however you like, such as a radio or select menu:
<select name="payment_method">
<option value="paypal_express" selected>Paypal</option>
<option value="manual">Manual</option>
</select>
The {payment_method_options}
variable is really only a helper, and is by no means required.
The reason we implemented it this way is simple: when we designed Store, we took a step back and thought about how ecommerce should work in an ExpressionEngine context. Most ecommerce systems let you set up things like default payment methods (and drag and drop reordering of payment methods) because you are using off-the-shelf templates, which cater to users who don't like to get their hands dirty with HTML.
However, since with EE you are already coding the HTML from scratch, it seemed like a waste of time having to tell yourself what the default payment method is in the back end, then provide a bunch of template tags which let you display the default payment method you just configured. To ExpressionEngine developers it feels much more natural just to specify how things should work in the template (just as you do with a contact form, where you specify the destination email address in the template, and most other plugins have examples like this too).
Most sites only have a single payment method, so hard coding it in the template (alongside the fields required for that payment method, when you take credit cards directly on your site) makes the most sense for that scenario. When multiple payment methods are available, it's often nice to use radio buttons and display a logo next to each one, which would require extra template code anyway, so {payment_method_options}
isn't very useful there.
TL;DR: In most cases you will should hard code your payment_method
select/radio/hidden field directly in your template. The {payment_method_options}
variable is only a helper, and is certainly not intended to be the only way to display payment methods to your customers.