Non è un bug...ma ignoranza mia...il datagridview considera i dati come testo e non come valore.
Ho googlato un pò e per risolvere non ho trovato altra soluzione che quella di usare un dataset e specificare il tipo di dati della colonna, esempio:

codice:
Imports System.ComponentModel

Public Class Form1

    Dim ds As New Data.DataSet

    Private Sub Form1_Load() Handles MyBase.Load
        ds.DataSetName = "prova"
        ds.Tables.Add("colonne")
        ds.Tables("colonne").Columns.Add("numero")
        ds.Tables("colonne").Columns("numero").DataType = System.Type.GetType("System.Decimal")
        ds.Tables("colonne").Columns.Add("testo")
        DataGridView1.DataSource = ds.Tables(0)
    End Sub

    Private Sub Button1_Click() Handles Button1.Click
        DataGridView1.Sort(DataGridView1.Columns("numero"), ListSortDirection.Descending)
    End Sub

    Private Sub Button2_Click() Handles Button2.Click
        DataGridView1.Sort(DataGridView1.Columns("numero"), ListSortDirection.Ascending)
    End Sub

End Class
Con il dataset puoi anche salvare i dati e caricarli.