PXELINUX is not "doing symlinks": it's just downloading a configuration file whose name includes the client's IP or MAC address or part of it. The fact that the matching file happens to be a symlink is entirely between you and your TFTP server that provides the file to PXELINUX.
Note that unlike PXELINUX, GRUB only looks for a single configuration file, which is
grub.cfg by default. So that's what you need to supply it. If you want GRUB to use a configuration file whose name is somehow dependent on client's IP address, you'll need to tell that to GRUB.
That configuration file can then tell GRUB to load another configuration file... and you can use GRUB environment variables when specifying its name.
So, if you want GRUB to use a configuration file named
grub.cfg-<IP address>, then you should first create a very minimal
grub.cfg file in the location expected by GRUB, and have it say something like this (only):
This should tell GRUB to download a new configuration file with the client IP address suffixed to the filename.
You might even specify the new configuration file with an absolute path, with something like
If you don't like having a separate
grub.cfg file with just the one line defining a new configuration file, you could embed this one-line configuration into the GRUB PXE boot image, by using
grub-mkimage -c <grub.cfg containing the configfile command> -O i386-pc-pxe <other parameters...> (or whichever architecture you're using).
You've probably already discovered that when you're having trouble getting PXE boot working, it's useful to dump the network traffic between the PXE client and the DHCP/TFTP server(s) with something like
wireshark to verify the client is getting the correct information and requesting the correct files in turn... right?