@Joshua I am not using any of the web parts out of the box - we need full control of the markup, and we gave up trying to configure the installed web parts to suit our needs after a few hours of getting nowhere. So far I have been able to piece the above code together from various payment-related web parts. I have omitted the (working) billing address, shipping address, and shipping method code, which was also pulled from various out-of-the-box web parts - those values are correctly applied to the ShoppingCart, and the Order (once SetOrder() is called).
I have inspected the ShoppingCart and PaymentGatewayProvider objects, and found that almost nothing was null, so whatever it is is probably buried in a child object somewhere. Unfortunately, it's bombing out outside of source I have access to.
I had been working off of the E-Commerce starter site as an example, and haven't checked out Dancing Goat (I just started an install including that one - thanks for the tip on that).