Crea una variable de sesion antes de ingresar el primer items a la tabla, primero le asigna el valor de la variable de sesion a la tabla y luego ingresas el nuevo items, cuando introduzca el items vuelve y asignas el valor de la tabla a la misma variable de sesion, luego asignas el origen de dato de gridview desde la variable de sesion.
Cita: dtprec = dt.NewRow();
dtref["precio"] = precio;
dt.Rows.Add(dtprec);
session("miTabla")=dt
gdproductos.DataSource = DirectCast(session("miTabla"),datatable)
gdproductos.DataBind();
Este es el camino solo tienes que cuidar los postback verificando si la variable de session esta o no creada al inicio del primer postback y verificar cada vez que quieras ingresar un nuevo items.
Espero esto te ayude.