PALib is an excellent starting point for DS stuff if you want to get it done quickly and well, though the library has always felt a tad messy.
If you feel really adventurous (and smart), you can try going at it straight with libnds.
Another way to go at it is building / porting stuff for DSLinux. That will require a ginormous toolchain and a pile of source code to be downloaded, and a huge wait for the first compile, and your programs will only run through DSLinux, but it has its advantages.
Of course, software for DSLinux differs greatly. ("I ported the cat command" | "Great!!!").
It is a nice thing to do software for because, of course, it is an operating system: The networking stuff is done for you, your program can be run alongside any other program (you don't need to add a music player to your program; just run madplay), you can boot and kill a program quite easily, automatic access to the extra RAM provided by some flash carts like Supercard CF, easy filesystem access, etc.
Then there's the stuff which you simply can't do in DSLinux at the moment, like using both screens, having 3D, or easily having something that looks 'pretty'.
Another more radical option would be to build something for System 6 :b
http://lazyone.drunkencoders.com/wordpress/C / C++ knowledge is what you will need for all of those.