This will create a panel and listbox near a cell location that when clicked on will show a listbox of options that can be clicked. This derived from a requirement where there are many email addresses in various cell values in the row and I wanted a 'selector' for the user to pick which person/people to send mail to.

Code:
    Private Sub DGV_PurchaseReq_ShowEmailPanel(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_PurchaseReq.CellContentClick
        If DGV_PurchaseReq.CurrentCell.OwningColumn.Name = "EmailReq" Then

            For Each ctrl As Control In DGV_PurchaseReq.Controls
                If TypeOf ctrl Is Panel Then
                    DGV_PurchaseReq.Controls.Remove(ctrl)
                End If
            Next

            Dim Pan As New Panel With {
                .BackColor = SystemColors.Control,
                .Width = 150, .Height = 200,
                .Visible = False,
                .Padding = New Padding(10)}


            Dim EmailListBox As New ListBox With {
                .BorderStyle = BorderStyle.Fixed3D,
                .Visible = False,
                .Font = New Font("Arial", 10, FontStyle.Regular),
                .Dock = DockStyle.Fill}

            With EmailListBox
                .Items.Add("All Parties")
                .Items.Add("Initiator")
                .Items.Add("Requisitioner")
                .Items.Add("Deliver To")
                .Items.Add("Approvers")
                .Items.Add("Purchase Manager")
            End With

            Pan.Controls.Add(EmailListBox)

            DGV_PurchaseReq.Controls.Add(Pan)

            Dim Rect As Rectangle = DGV_PurchaseReq.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, True)

            Pan.Location = New Point(Rect.X + 5, Rect.Y + 5)

            Pan.Visible = True
            EmailListBox.Visible = True


            AddHandler EmailListBox.SelectedIndexChanged, AddressOf PickMailTo

        End If

    End Sub

    Private Sub PickMailTo(Sender As Object, e As EventArgs)
        Dim LB As ListBox = DirectCast(Sender, ListBox)

        Select Case LB.Text
            Case "All Parties"

            Case "Initiator"

            Case "Requisitioner"

            Case "Deliver To"

            Case "Approvers"

            Case "Purchase Manager"
        End Select


        'The following is executing but not removing the panel control
        For Each ctrl As Control In DGV_PurchaseReq.Controls
            If TypeOf ctrl Is Panel Then
                MsgBox(ctrl.Name) 'response ="EmailPanel"
                DGV_PurchaseReq.Controls.Remove(ctrl)
            End If

        Next
    End Sub

    Private Sub DGV_PurchaseReq_CellLeave(sender As Object, e As DataGridViewCellEventArgs) Handles DGV_PurchaseReq.CellLeave
        If DGV_PurchaseReq.CurrentCell.OwningColumn.Name = "EmailReq" Then
            For Each ctrl As Control In DGV_PurchaseReq.Controls
                If TypeOf ctrl Is Panel Then
                    DGV_PurchaseReq.Controls.Remove(ctrl)
                End If
            Next
        End If
    End Sub

    Private Sub DGV_PurchaseReq_Scroll(sender As Object, e As ScrollEventArgs) Handles DGV_PurchaseReq.Scroll
        If DGV_PurchaseReq.CurrentCell.OwningColumn.Name = "EmailReq" Then
            For Each ctrl As Control In DGV_PurchaseReq.Controls
                If TypeOf ctrl Is Panel Then
                    DGV_PurchaseReq.Controls.Remove(ctrl)
                End If
            Next
        End If
    End Sub