I don't have any Azure stuff to try, but this should at least demonstrate creating a strongly typed list:
$InboundNatPools = New-Object System.Collections.Generic.List[string]
$InboundNatPools.add("abc")
$InboundNatPools.add([decimal]1.23)
$InboundNatPools.add(10E2)
If you examined the object types of each list element you'd see they all have the same type: "string", and the values would be the string representation of the original object because each of them has a "ToString() method so the implicit cast works.
Give it a try using "[Microsoft.Azure.Batch.InboundNatPool]" in place of "[string]" in the example.