Solved it :)
Just edit the return string from the GetCustomUI on runtime, but trap the explorer item first
Public Function GetCustomUI(ByVal ribbonID As String) As String Implements Office.IRibbonExtensibility.GetCustomUI
Dim strResText As String = ""
Dim strGetRes As String = ""
Select Case ribbonID
Case "Microsoft.Outlook.Appointment"
strGetRes = GetResourceText("OutlookAddIn.Ribbon1.xml")
strResText = strGetRes.Replace("TabNewMailMessage", "TabAppointment") 'default value of it is TabNewMailMessage
Case Else
strResText = GetResourceText("OutlookAddIn.Ribbon1.xml")
End Select
Return strResText
End Function
Original XML string:
<tab id="customTab" label="myCustomTab" insertBeforeMso="TabNewMailMessage" visible="true">
New XML string on Appointment item window:
<tab id="customTab" label="myCustomTab" insertBeforeMso="TabAppointment" visible="true">