I went back to your original post as your comments regarding New York on your last post are a bit harsh so I will leave that to you guys. You may notice New York has the top Karma and so his only intention is to help on the forums and I think you miss understood his comment.
Anyway I you need to evaluate the way you are trying to solve the problem. I just checked in v3.9 you can disable all the fields you dont want to display. Just leave name and phone enabled in the settings. Then as you say you do need the Shipping Country, etc when not picking up and shipping is required and so you actually want to enable those settings temporarily.
It uses the same NewAdress model and _CreateOrUpdateAddress.cshtml view for both Shipping and Billing Address but the calling function is different so this allows some intenvention.
Just before it builds the Address model for shipping you can override the Addresss settings.
In routine public virtual CheckoutShippingAddressModel PrepareShippingAddressModel(..)
Change the code just above //new address to
_addressSettings.CountryEnabled = true;
_addressSettings.StateProvinceEnabled = true;
_addressSettings.CityEnabled = true;
_addressSettings.CityRequired = true;
_addressSettings.StreetAddressEnabled = true;
_addressSettings.StreetAddressRequired = true;
_addressSettings.ZipPostalCodeEnabled = true;
_addressSettings.ZipPostalCodeRequired = true;
//new address - this bit is the same - no change here
model.NewAddress.CountryId = selectedCountryId;
Of course you need to untick Ship to Same address as the Billing address will not have the shipping address details (maybe you do some other change in the model to force this)
Also when it populates the Dropdown for selecting an exisitng shipping address only list valid address i.e. has Country, State, etc
Good luck with sorting out the problem