Thanks Walaa,
After some trial and error I managed to pass a user string, using the WCF example from LLBLGen (see Example download page for WCF using C# and adapter model)..
In the client project I added the following to the Main method:
// Open a channel with the WCF service endpoint, and keep it alive till the end of the program.
ChannelFactory<INorthwindService> channelFactory = new ChannelFactory<INorthwindService>("WCFServer");
INorthwindService service = channelFactory.CreateChannel();
string username = System.Security.Principal.WindowsIdentity.GetCurrent().Name;
MessageHeader userHeader = new MessageHeader<string>(username).GetUntypedHeader("userToken", "ns");
OperationContextScope scope = new OperationContextScope((IContextChannel)service);
OperationContext.Current.OutgoingMessageHeaders.Add(userHeader);
I now can read the domainname\username from the client program in every method of the CustomerService project e.g. :
string user = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("userToken", "ns");
For adding more info or complex types you have to make a class and inherit the MessageHeader type so you can serialize all the data required.
I am not sure how this works with encryption or signing of the soapheader using WCF .