using onChange="this.form.submit();" for the radio buttons is the correct way to post the form when a radio button is changed, your problem is the trigger for setting the shippingmethod session variable.
if (isset($_POST["Update_shipping"]) || isset($_POST["Update_shipping_x"])) { //if the shipping form has been posted, set the shipping method based on the form value, otherwise do nothing, this is necessary, as on form post, the confirmation email uses the session values for shipping and charges
$_SESSION["shippingmethod"] = "".((isset($_POST["grpshipping"]))?$_POST["grpshipping"]:"") ."";
}
this code uses the Update_shipping button as the trigger. when you post the form using the onchange event, it does not post the Update_shipping button so does not trigger the session. you need to use the grpshipping element as the trigger for setting that session variable instead of the Update_shipping button.
if (isset($_POST["grpshipping"])) { //if the shipping form has been posted, set the shipping method based on the form value, otherwise do nothing, this is necessary, as on form post, the confirmation email uses the session values for shipping and charges
$_SESSION["shippingmethod"] = "".((isset($_POST["grpshipping"]))?$_POST["grpshipping"]:"") ."";
}