I wouldnt use a grid because of the overhead in binding and viewstate. I would use a data list or template control. Chances are you wont need to sort a cart, page it. You would normally need access to a header section, a footer section, and the ability to make your rows into templates.
I would probably personally use a template control and bind to it, write my own pager, and write my own delete item, change quantity, and update total methods. You will find that the viewstate is much less using a template control and it binds faster when compared to a datagrid.
IMO, using a data grid is like using a Data Set. Its great for quick prototyping, but when you need a highly customizable interface and you need to consider load, and a production environment, there are more effecient ways.
I would probably persist the cart into the session object, or even a database table. The bad thing about a db table is that if the person leaves the store you will need to clean up the cart at some point, where the session is only there while the user is. The only potentially bad thing about the session is that it can eat memory under high loads and doesnt scale to web farms without some nasty url tricks. So if you have a fast db server, then saving the cart in the db is cool, plus users can come back to the cart before it gets cleaned up and use it again. All of the big ecommerce people have carts that live for a few days.
Thats my 2 cents or shopping carts.