Basta che ti crei un Custom Control, ti posto la base del codice.

codice:
Imports System.Drawing.Drawing2D

Public Class SmoothProgressBar
    Private min As Integer = 0               ' Minimum value for progress range
    Private max As Integer = 100             ' Maximum value for progress range
    Private val As Integer = 75              ' Current progress
    Private barColor As Color = Color.Blue   ' Color of progress meter
    Private gradientinit As Color = Color.Black
    Private gradientfinal As Color = Color.Blue
    Private gradient As Boolean
    Private gradientType As System.Drawing.Drawing2D.LinearGradientMode
    Private GradientTextView As Boolean

    Protected Overrides Sub OnResize(ByVal e As EventArgs)
        ' Invalidate the control to get a repaint.
        Me.Invalidate()
    End Sub

    Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
        Dim g As Graphics = e.Graphics
        Dim brush As SolidBrush = New SolidBrush(barColor)
        Dim percent As Decimal = (val - min) / (max - min)
        Dim rect As Rectangle = Me.ClientRectangle

        ' Calculate area for drawing the progress.
        rect.Width = rect.Width * percent
        Label1.Location = New Point((Me.Width - Label1.Width) / 2, (Me.Height - Label1.Height) / 2)
        Label1.Text = CStr(CInt((percent * 100))) & "%"

        ' Draw the progress meter.
        If gradient = True Then
            Dim br As New LinearGradientBrush(Me.ClientRectangle, gradientinit, gradientfinal, gradientType)
            g.FillRectangle(br, rect)
        Else
            g.FillRectangle(brush, rect)
        End If

        ' Draw a three-dimensional border around the control.
        Draw3DBorder(g)

        ' Clean up.
        brush.Dispose()
        g.Dispose()
    End Sub

    Public Property GradientFillType() As System.Drawing.Drawing2D.LinearGradientMode
        Get
            Return GradientType
        End Get
        Set(ByVal value As System.Drawing.Drawing2D.LinearGradientMode)
            gradientType = value
            Me.Refresh()
        End Set
    End Property

    Public Property GradientColorInit() As Color
        Get
            Return gradientinit
        End Get
        Set(ByVal value As Color)
            gradientinit = value
            Me.Refresh()
        End Set
    End Property

    Public Property GradientColorFinal() As Color
        Get
            Return gradientfinal
        End Get
        Set(ByVal value As Color)
            gradientfinal = value
            Me.Refresh()
        End Set
    End Property

    Public Property GradientColor() As Boolean
        Get
            Return gradient
        End Get
        Set(ByVal value As Boolean)
            gradient = value
            Me.Refresh()
        End Set
    End Property

    Public Property GradientText() As Boolean
        Get
            Return Label1.Visible
        End Get
        Set(ByVal value As Boolean)
            Label1.Visible = value
            Label1.Refresh()
        End Set
    End Property

    Public Property GradientTextColor() As Color
        Get
            Return Label1.ForeColor
        End Get
        Set(ByVal value As Color)
            Label1.ForeColor = value
            Label1.Refresh()
        End Set
    End Property

    Public Property GradientTextFont() As Font
        Get
            Return Label1.Font
        End Get
        Set(ByVal value As Font)
            Dim p As New Font(value.Name, value.Size, value.Style)
            Label1.Font = p
            Label1.Refresh()
        End Set
    End Property


    Public Property Minimum() As Integer
        Get
            Return min
        End Get

        Set(ByVal Value As Integer)
            ' Prevent a negative value.
            If (Value < 0) Then
                min = 0
            End If

            ' Make sure that the minimum value is never set higher than the maximum value.
            If (Value > max) Then
                min = Value
                min = Value
            End If

            ' Make sure that the value is still in range.
            If (val < min) Then
                val = min
            End If

            ' Invalidate the control to get a repaint.
            Me.Invalidate()
        End Set
    End Property

    Public Property Maximum() As Integer
        Get
            Return max
        End Get

        Set(ByVal Value As Integer)
            ' Make sure that the maximum value is never set lower than the minimum value.
            If (Value < min) Then
                min = Value
            End If

            max = Value

            ' Make sure that the value is still in range.
            If (val > max) Then
                val = max
            End If

            ' Invalidate the control to get a repaint.
            Me.Invalidate()
        End Set
    End Property

    Public Property Value() As Integer
        Get
            Return val
        End Get

        Set(ByVal Value As Integer)
            Dim oldValue As Integer = val

            ' Make sure that the value does not stray outside the valid range.
            If (Value < min) Then
                val = min
            ElseIf (Value > max) Then
                val = max
            Else
                val = Value
            End If

            ' Invalidate only the changed area.
            Dim percent As Decimal

            Dim newValueRect As Rectangle = Me.ClientRectangle
            Dim oldValueRect As Rectangle = Me.ClientRectangle

            ' Use a new value to calculate the rectangle for progress.
            percent = (val - min) / (max - min)
            newValueRect.Width = newValueRect.Width * percent

            ' Use an old value to calculate the rectangle for progress.
            percent = (oldValue - min) / (max - min)
            oldValueRect.Width = oldValueRect.Width * percent

            Dim updateRect As Rectangle = New Rectangle()

            ' Find only the part of the screen that must be updated.
            If (newValueRect.Width > oldValueRect.Width) Then
                updateRect.X = oldValueRect.Size.Width
                updateRect.Width = newValueRect.Width - oldValueRect.Width
            Else
                updateRect.X = newValueRect.Size.Width
                updateRect.Width = oldValueRect.Width - newValueRect.Width
            End If

            updateRect.Height = Me.Height
            ' Invalidate only the intersection region.
            Me.Invalidate(updateRect)
        End Set
    End Property

    Public Property ProgressBarColor() As Color
        Get
            Return barColor
        End Get

        Set(ByVal Value As Color)
            barColor = Value
            ' Invalidate the control to get a repaint.
            Me.Invalidate()
        End Set
    End Property

    Private Sub Draw3DBorder(ByVal g As Graphics)
        Dim PenWidth As Integer = Pens.White.Width

        g.DrawLine(Pens.DarkGray, _
            New Point(Me.ClientRectangle.Left, Me.ClientRectangle.Top), _
            New Point(Me.ClientRectangle.Width - PenWidth, Me.ClientRectangle.Top))
        g.DrawLine(Pens.DarkGray, _
            New Point(Me.ClientRectangle.Left, Me.ClientRectangle.Top), _
            New Point(Me.ClientRectangle.Left, Me.ClientRectangle.Height - PenWidth))
        g.DrawLine(Pens.White, _
            New Point(Me.ClientRectangle.Left, Me.ClientRectangle.Height - PenWidth), _
            New Point(Me.ClientRectangle.Width - PenWidth, Me.ClientRectangle.Height - PenWidth))
        g.DrawLine(Pens.White, _
            New Point(Me.ClientRectangle.Width - PenWidth, Me.ClientRectangle.Top), _
            New Point(Me.ClientRectangle.Width - PenWidth, Me.ClientRectangle.Height - PenWidth))
    End Sub

End Class