wsdl.exe genera una serie di classi partial, che quindi possono essere estese in file separati.
A questo punto, fossi in te, io creerei le 4 classi e farei implementare loro (in file esterni, così che se riesegui wsdl.exe non devi metter mano sul codice autogenerato dei proxy) un'interfaccia con i membri comuni, che poi sono quelli che utilizzi in ogni invocazione.
Ovviamente lo stesso devi fare per la classe che rappresenta il risultato dell'invocazione.
L'unico potenziale problema è insito nella riga
req.ItemElementName = AXL61NSV.ItemChoiceType42.pin; // "pinCredPolicyName";
visto che dalla sintassi
AXL61NSV.ItemChoiceType42.pin
mi sembra essere un enumerato, che sarebbe pertanto un tipo diverso ad ogni invocazione. Qui, ad es., se nella tua invocazione usi sempre "pin", puoi creare un metodo SetItemElementName nell'interfaccia che wrappi quello statement, o creare un enum "standard" da utilizzare come argument per questo metodo.
A questo punto il tuo codice diventerebbe qualcosa tipo...
IAuthenticateUserReq req = AuthenticateUserReqFactory.GetProxy(version, namespace);
req.userid = userid;
req.SetupItemElementName();
req.Item = pin;
IAuthenticateUserResponse res = _axlas.doAuthenticateUser(req);
Ti resta da wrappare il webservice in modo che doAuthenticateUser accetti l'interfaccia invece che il tipo concreto. La factory AuthenticateUserReqFactory puoi anche implementarla brutalmente con qualche if, tanto restano concentrati al suo interno. In questo modo all'aggiunta di nuove versioni non devi far altro che far implementare l'interfaccia nelle opportune classi proxy e aggiungerle all'interno della factory stessa.
So che richiede un certo lavoro, vedi te se il gioco vale la candela :-)
A presto,
m.