Yes, you can do this with just a normal list/validation + VBA.
set up your validation values (name list). Pair with swaps (shortened names)
set up your data entry table
Data -> Validate using List
For the sheet, attach VBA (my brief test below)
watches the correct column on the data entry table
on event, swaps out the entry value with the replacement value
The only catch is that your VBA will trigger itself: the function changes the cell value, which triggers a cell change event, which triggers the same function, etc. Below, I break that loop by setting a flag, but there are probably other solutions.
EDIT: The cells in the image show a data validation flag. You can auto-clear that by adding one more instruction after setting the new value. I've updated the code snippet below.

Public DisabledFlag As Boolean
Private Sub Worksheet_Change(ByVal Target As Range)
Dim KeyCells As Range
Dim NewValue As Variant
If DisabledFlag = True Then
DisabledFlag = False
GoTo Disabled
End If
' The variable KeyCells contains the cells that will
' cause an alert when they are changed.
Set KeyCells = Range("D4:D12")
If Not Application.Intersect(KeyCells, Range(Target.Address)) _
Is Nothing Then
' Use the current value to get the 'real' value ...
On Error Resume Next
NewValue = WorksheetFunction.XLookup( _
Target.Value, _
Range("A4:A6"), _
Range("B4:B6"), _
"Not found")
On Error GoTo 0
' Setting the value will trigger this function ...
' Ignore that event.
DisabledFlag = True
Target.Value = NewValue
' Clear the data validation error message (the replacement value
' is not in the actual validation set, so Excel flags the cell)
Target.Errors(xlListDataValidation).Ignore = True
End If
Disabled:
End Sub
Active-X
combobox with VBA code.