The DotGNU project
is a Free Software implementation of the .NET and Mono platforms and
spans many different programming areas: from low-level tasks like code
generators to compilers, to class libraries and GUI applications.

If you want to modify or extend these tasks or have your own ideas,
please see the GNU
Project guidelines for Summer of Code projects. If you want to
discuss potential projects with the DotGNU team, we'd love to talk to
you about it. You can contact us by email on the DotGNU mailing
list, or by IRC on the #portable.net or #dotgnu channels on
irc.freenode.net.

For example add support for lambda/anonymous methods and the yield statement.
The Portable .NET C# compiler is based on bison, flex and the treecc tool.

Work on memory leaks, implement a special feature in the Garbage Collector. (Complexity: high)

It would be beneficial to have a method in GC which can enumerate all
objects which reference a specified object. The signature of this
method might be, for example, object[] GC.GetReferences( object
o ).

Replacing CIL with native code. (Complexity: high)

DotGNU contains a code generator that can be used for Just-in-Time
compilation at runtime. Code can also be compiled ahead of time to
produce native code before it's needed. The goal is to modify the runtime
and compilation so that the bytecodes can be safely removed from a program
and a single image is shipped containing both metadata and native code.

Tasks for libjit (The just-in-time compiler used by Portable.Net

The Portable .NET implements Just-In-Time compilation
functionality. Unlike other JIT's, libJIT (a reusable JIT library) is
designed to be independent of any particular virtual machine bytecode
format or language. If you run Portable .NET on a machine for which a
native code generator is not yet available, then Portable .NET will
fall back to interpreting the code.

Add support for reading and writing shared libraries from JIT'ed code (Complexity: medium-high)

Complete ELF reader and writer.
You can also add support for any other storage/container format (PECOFF for example).
You'll have to add the infrastructure for handling relocations too.

Port libJIT to a new architecture or improve existing architecture support (Complexity: medium-high)

You could port libJIT to a new architecture, for example PPC, OpenRISC,
SPARC, MIPSEL and so on or improve an existing code generator (alpha, ...).
The libJIT
manual describes the steps needed to for porting libJIT to new
architectures.