<asp:GridView ID="GridView1" runat="server" ShowHeader="false"></asp:GridView>

codice:
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim dt As DataTable = libreria.GetDataTable(StringaConnessioneTest, "SELECT * FROM REGIONI ORDER BY CODICE_ISTAT_REGIONE")

        dt = getDataTableReverse(dt)

        Me.GridView1.DataSource = dt
        Me.GridView1.DataBind()
    End Sub


    Public Function getDataTableReverse(ByVal dt As DataTable) As DataTable
        Dim t As New DataTable()
        t.Columns.Add("campo", GetType(String))
        For i As Integer = 0 To dt.Rows.Count - 1
            t.Columns.Add("valore_" & i, GetType(String))
        Next

        For i As Integer = 0 To dt.Columns.Count - 1
            Dim dr As DataRow = t.NewRow()
            dr(0) = dt.Columns(i).ColumnName
            For j As Integer = 0 To dt.Rows.Count - 1
                dr(j + 1) = dt.Rows(j)(i)
            Next
            t.Rows.Add(dr)
        Next
        Return t

    End Function
le colonne sono tutte stringhe, perciò la formattazione date e numeri vanno fatte nell'evento databoud o simile (non ricordo)