Criss-Platform Best Practices?

I am designing a GUI application that will initially run on Windows but

will eventually be ported to Linux and hopefully MacOS. My plan is to
build on the dotnet framework and later use mono and/or portable.NET to

port application to other platforms. This app will use graphic
functions to analyse and modify image files.

What I am looking for is a best practices guide to making sure an
application can be moved from MS.NET to Mono and portable.NET and
minimize the gotchas that I'm sure will arise. Does anyone have any
tips or know of such a document that could help? I'd mostly like to
know which .NET classes to avoid and get suggestions on alternate third

party toolkits and libraries that could help.

Also, this app will be released as open source (probably under the GPL)

so I'm also looking for open source solutions. (commercial packages
won't work)