After trying various approaches I thought the best solution was to write my own SelectListExtension.
The Extension I wrote is based around the "Choice", "Choices" and "ChoicesEnum" classes.
Public Module ChoicesListExtension
<Extension()>
Public Function DropDownListFor(ByVal ObjSelectList As Choices, ByVal HtmlCtrlId As String) As String
'
Dim Buf As String = Nothing
Dim Counter1 As Integer = Nothing
'
Buf = ""
If (ObjSelectList Is Nothing) = False Then
If Trim(HtmlCtrlId) <> "" Then
Buf = "<select id=" & Chr(34) & Trim(HtmlCtrlId) & Chr(34) & ">" & vbCrLf
Else
Buf = "<select>" & vbCrLf
End If
If ObjSelectList.Items.Count > 0 Then
For Counter1 = 0 To ObjSelectList.Items.Count - 1
Buf = Buf & " <option value=" & Chr(34) & ObjSelectList(Counter1).ItemValue Chr(34)
If ObjSelectList(Counter1).ItemSelected Then Buf = Buf & " selected=" & Chr(34) & "selected" & Chr(34)
Buf = Buf & ">" & Trim(ObjSelectList(Counter1).ItemText) & "</option>" & vbCrLf
Next
End If
Buf = Buf & "</select>" & vbCrLf
End If
DropDownListFor = Buf
Buf = Nothing
Counter1 = Nothing
'
End Function
<Extension()>
Public Function DropDownListFor(ByVal ObjSelectList As Choices, ByVal HtmlCtrlId As String, ByVal HtmlAttribs As RouteValueDictionary) As String
'
Dim Buf As String = Nothing
Dim Counter1 As Integer = Nothing
Dim Counter2 As Integer = Nothing
'
Buf = ""
If (ObjSelectList Is Nothing) = False Then
If Trim(HtmlCtrlId) <> "" Then
Buf = "<select id=" & Chr(34) & Trim(HtmlCtrlId) & Chr(34)
If HtmlAttribs.Count > 0 Then
For Counter1 = 0 To HtmlAttribs.Count - 1
Buf = Buf & " " & HtmlAttribs.Keys(Counter1) & "=" & Chr(34) & HtmlAttribs.Values(Counter1) & Chr(34)
Next
End If
Buf = Buf & ">" & vbCrLf
Else
Buf = "<select>" & vbCrLf
End If
If ObjSelectList.Items.Count > 0 Then
For Counter2 = 0 To ObjSelectList.Items.Count - 1
Buf = Buf & " <option value=" & Chr(34) & ObjSelectList(Counter2).ItemValue & Chr(34)
If ObjSelectList(Counter2).ItemSelected Then Buf = Buf & " selected=" & Chr(34) & "selected" & Chr(34)
Buf = Buf & ">" & Trim(ObjSelectList(Counter2).ItemText) & "</option>" & vbCrLf
Next
End If
Buf = Buf & "</select>" & vbCrLf
End If
DropDownListFor = Buf
Buf = Nothing
Counter1 = Nothing
Counter2 = Nothing
'
End Function
End Module