I have been doing some incredibly deep work with inter OS services written in C# for ease of support at work. I could get into the reasons we are using Mono, but I will just cut to the chase.
I was executing a shell script using System.Diagnostics.Process.Start(), and always received ExitCode 255. After a bit of research, it sounded like 255 meant that Mono was unable to start the process.
I added !#/bin/sh to the top of my script, and viola! Exit code 0 (success)!
Disclaimer: The script I was running was not written by me. I try to make a habit of adding the executable line at the top by default.