The answer I got externally was to create a custom DeliveryBuilder and include whatever columns I needed in the InitCustomData(cart) implementation:
using CMS;
using CMS.Ecommerce;
[assembly: RegisterImplementation(typeof(IDeliveryBuilder), typeof(CustomDeliveryBuilder))]
public class CustomDeliveryBuilder : DefaultDeliveryBuilder
{
protected override void InitCustomData(ShoppingCartInfo cart)
{
base.InitCustomData(cart);
cart.ShoppingCartCustomData.ColumnNames.ForEach(column => SetCustomData(column, cart.ShoppingCartCustomData[column]));
}
}
While that works for custom data at the cart level, here is my implementation for the cart item level:
using CMS;
using CMS.Ecommerce;
[assembly: RegisterImplementation(typeof(IDeliveryBuilder), typeof(CustomDeliveryBuilder))]
public class CustomDeliveryBuilder : DefaultDeliveryBuilder
{
protected override void InitItemCustomData(DeliveryItem deliveryItem, ShoppingCartItemInfo cartItem)
{
base.InitItemCustomData(deliveryItem, cartItem);
cartItem.CartItemCustomData.ColumnNames.ForEach(column => deliveryItem.CustomData.SetValue(column, cartItem.CartItemCustomData[column]));
}
}