vb.net – Building an array of KeyboardButton objects in a ReplyKeyBoardMarkup for a Telegram Bot

I asked my original question and based on the answers got a version working. Essentially, I created a reply keyboard from the available product codes in my database table, with one button per row.
What I want to know now is how to have more than one button per row. I would ideally like to have two or three buttons per row.
My real problem is I cannot get my head around the Lists syntax, so I’d like some advice please.

Here is a working piece of the code:

Select case lcase(Cmd)
' Various other case statements not shown

 Case "products", "product", "items"
                    'New KeyboardButton()() {New KeyboardButton() {New KeyboardButton("/pd 001"), New KeyboardButton("/pd 002")}, New KeyboardButton() {New KeyboardButton("/pd 003"), New KeyboardButton("/pd 004")}}
                    Dim keyboardButtons As New List(Of KeyboardButton())

                    Bot.SendChatAction(message.Chat.Id, "typing")
                    MsgText = "Our available __Products__" & vbCrLf
                    mySQL = "select * from products;"
                    Dim cs As String = "URI=file:" & DBName
                    Using con As New SQLiteConnection(cs)
                        con.Open()
                        Dim dr As SQLiteDataReader

                        Using DBcmd As New SQLiteCommand(con)
                            DBcmd.CommandText = mySQL
                            dr = DBcmd.ExecuteReader()
                            While dr.Read()
                                MsgText &= String.Format("*{0}* ({1})({3}), Price: ${2}", dr("Code"), Replace(dr("ProdName"), "-", " "), dr("Price"), dr("ProdURL")) & vbCrLf
                                
                                keyboardButtons.Add({New KeyboardButton($"/pd {dr("Code")}")}) ' This is the line of interest
                            End While
                        End Using
                        con.Close()
                    End Using
                    MsgText &= vbCrLf & "Type '/pd *code*' to view a specific product *Note* Don't forget the *space* between /pd and the code" & vbCrLf

                    MsgText &= "Please visit (our website)(" & ConfigWebsite & ") for more information"

                    Dim keyboard As New ReplyKeyboardMarkup With {.Keyboard = keyboardButtons.ToArray()}
                    keyboard.OneTimeKeyboard = True
                    keyboard.ResizeKeyboard = True
                    Bot.SendMessage(message.Chat.Id, MsgText, "MarkdownV2",,, replyMarkup:=keyboard)

Case Else

' etc
End Select

Update:
Here is a piece of code which adds a complete keyboard in one foul sweep:

Dim keyboard = New ReplyKeyboardMarkup With {
        .Keyboard = New KeyboardButton()() {New KeyboardButton() {New KeyboardButton("/pd 001"), New KeyboardButton("/pd 002")}, New KeyboardButton() {New KeyboardButton("/pd 003")}},
        .ResizeKeyboard = True
    }

Two buttons in the first row and one in the second.