If you are particularly interested in maths, a raytracer is a very good choice.
It allows you to use both basic and more advanced features in a cool real world application, requiring a mix of paradigms like object-orientation (design patterns), proceduralism, concurrency (multithreading) and functional programming (linq*, recursion) giving you a nice overview of different language features without relying on external libraries.
Its basic implementation is not too big or complicated, but the project is highly extensible if you like a bigger thing - You can always increase the level of detail or perfection, introduce a GUI (WPF*) or even create a domain-specific scene language showing how to use compiler compilers!
And - in comparison with other demo applications - raytracers have very nice outputs!
See this C# raytracer* as an introduction.
*Things marked with an asterisk are C#-specific but apply to other languages as well in slightly different forms.