There are severeal ways of doing this. One is to have GRUB on the MBR on your harddrive, and booting whatever OS you have in you /boot/grub/menu.lst.
I have Windows XP on my first partition, Slitaz on my second and Arch on my third. This is only on my laptop. My desktop computer looks even worse 😉
Anyway – WinXP requires to be boot from the first partition following the MBR or something. Go figure. And it has its own bootloader, so GRUB must chainload it. I also did this with my first trial of Arch – chainloading a second GRUB install which deals with its respective kernels. This way new kernels will be populated in its own menu which belongs to the correct partition and OS, which keeps my original menu.lst clean(er).
My /boot/grub/menu.lst which resides on my /dev/hda, looks like this. As you can see, I could install GRUB on my Slitaz partition as well – to keep it even cleaner.
# /boot/grub/menu.lst: GRUB boot loader configuration. default 2 # 3rd entry timeout 2 # seconds delay title Windows rootnoverify (hd0,0) makeactive chainloader +1 title SliTaz Latest (Kernel 18.104.22.168-slitaz) root (hd0,1) kernel /boot/vmlinuz-22.214.171.124-slitaz root=/dev/hda2 title Slitaz (wireless) (Kernel vmlinuz-126.96.36.199-slitaz) root (hd0,1) kernel /boot/vmlinuz-188.8.131.52-slitaz root=/dev/hda2 title Arch Linux [chainload] root (hd0,2) chainloader +1