It seems like there are some code samples for what you are looking for here:
http://msdn.microsoft.com/en-us/library/hh243641.aspx
I think you need to request a token for the wl.basic scope to get an access token that contains the user email address claim.
So according to the link, one way to do this would be like this:
private async void btnGreetUser_Click(object sender, RoutedEventArgs e)
{
try
{
LiveAuthClient auth = new LiveAuthClient();
LiveLoginResult initializeResult = await auth.InitializeAsync();
try
{
LiveLoginResult loginResult = await auth.LoginAsync(new string[] { "wl.basic" });
if (loginResult.Status == LiveConnectSessionStatus.Connected)
{
LiveConnectClient connect = new LiveConnectClient(auth.Session);
LiveOperationResult operationResult = await connect.GetAsync("me");
dynamic result = operationResult.Result;
if (result != null)
{
this.infoTextBlock.Text = string.Join(" ", "Hello", result.name, "!");
}
else
{
this.infoTextBlock.Text = "Error getting name.";
}
}
}
catch (LiveAuthException exception)
{
this.infoTextBlock.Text = "Error signing in: " + exception.Message;
}
catch (LiveConnectException exception)
{
this.infoTextBlock.Text = "Error calling API: " + exception.Message;
}
}
catch (LiveAuthException exception)
{
this.infoTextBlock.Text = "Error initializing: " + exception.Message;
}
}
So you pass the scope as a string array, and instead of using the wl.basic scope you have to use, the wl.emails scope, to get access to the email info, see:
http://msdn.microsoft.com/en-us/library/hh243646.aspx#wlemails