I'll second the need for a Steamworks.NET tutorial as applied to XNA/Monogame. The Steam and .NET documentation leave a lot to be desired while all of the engine folk have easy buttons to make this stuff happen more or less automatically. A list of steamworks.NET methods, what they do, and how they work would be helpful.
Just setting things up has a lot of pitfalls. Here's what I had to do to get things working:
1) Download the Standalone and Source Code zips from https://github.com/rlabrecque/Steamworks.NET/releases
2) The Standalone zip will have a Windows x86 folder. In Visual Studio reference the Steamworks.NET.dll in this folder to your main project (the versions in the other folders are 64 bit and will break things). Build.
3) Add the following to the folder containing your game's .exe (either debug or release if testing, or what you are actually shipping)
a) Add the steam_appid.txt file and change the contents to your game's Steam ID
b) For XNA or Monogame Windows add from the Standalone Windows x86 folder: Steam_api.dll and CSteamworks.dll (again, don't take the 64 bit version of Steam_api.dll - it will break things).
c) For Linux add libsteam_api.so and libCSteamworks.so from the OSX-Linux x64 folder.
d) For Mac add the CSteamworks.bundle folder from the OSX-Linux x64 folder. Remember the other Source Code .zip that was originally downloaded? Open that up and add Steamworks.NET.dll.config from the Standalone folder.
The above setup works for Windows 32 and 64, Mac 64, and Linux 64. I'm not sure what will happen with Linux 32 bit.
The game should now phone home to Steam automatically, but it is important to test.
1) Add "using Steamworks" to any relevant classes.
2) Set up a global bool isSteamRunning so we can ignore steam stuff if the client isn't running.
3) In the game's Initialize(), check if the client is running with "if (SteamAPI.Init())" and if so set your isSteamRunning to true.
4) Prior to the game's shutdown, add "SteamAPI.Shutdown();".
5) Tie a funny picture or text to isSteamRunning and run the game. If your funny picture shows up, then your game is tied into Steam.
My only implementation was to have the game push achievements to Steam. Most of these worker bee steamworks methods will crash the game if steam isn't running so be sure to check isSteamRunning each time. It wouldn't hurt to also put these in a try catch for an edge case where the steam client closes while the game continues. Here's all you need for pushing achievements to Steam:
1) "SteamUserStats.SetAchievement("ID_of_achievement");". The ID is the first column/name that you set in Steam. This line immediately pushes the achievement to steam and it will immediately be reflected in the client. For some reason it will delay the achievement time stamp and pop up (icon in corner of screen) until the game is closed. The fix is to follow with:
2) "SteamUserStats.StoreStats();". This will immediately time stamp the achievement and immediately create the screen corner pop up.
While testing, you'll want to use "SteamUserStats.ClearAchievement("ID_of_achievement");" This clears the achievement flag for your account so that you can retest. Make sure to comment out or delete before shipping.