What is the input and output and interaction of the program?
If it is text- or file based, then it doesn't really matter what language it is written in. The simplest example of such an application is the standard Unix filter, which reads from stdin and writes to stdout. In testing, you can treat it as a black box, and it doesn't matter at all what language it is written in. You just feed it a battery of test cases on its input, observe the output, and verify that the output is as expected. For a standard filter, this is actually quite simple to do with a shell scripts, a series of canned inputs and outputs, and diff.
If the program reads and writes other files, or has other state it stores somewhere, it gets a little harder, but it still doesn't change the basic paradigm: feed it input, observe the output, and keep track of state changes. If the program has GUI interaction (draws output in windows, requires keyboard or mouse input), then testing gets much harder to automate, since one has to write programs to pretend to use keyboard and mouse, and observe the pixels change.
But the important part is this: If you want to treat your program as a black box for the purpose of testing, then it doesn't matter what language it is written in, and C# and Mono make no difference at all.
There are lots of software testing frameworks around. Professional software testing people use and write those, and some are supposedly very useful and save work. When I'm acting as an amateur developer for stuff at home, I ignore those frameworks, and instead write simplistic shell scripts that just check the output of the program.