How do I set the user principal name that the client will use when calling the service?

The user principal name can be set through either code or configuration, and it's considered a part of the endpoint address used by the client. That means that physically you'll find the user principal name and the description of the endpoint collocated.

In configuration that looks like:

<client>
<endpoint address="..." binding="..." bindingConfiguration="..." contract="..." name="...">
<identity>
<userPrincipalName value="name@address.com" />
</identity>
</endpoint>
</client>

And, in code that looks like:

EndpointAddress address = new EndpointAddress(
"...",
UpnEndpointIdentity.CreateUpnIdentity("name@address.com"),
null
);

Next time: Differences Between WSDL and XSD