A xilinx style jtag cable can be pretty inexpensive, and it's likely possible with pc-side software and a wiring adapter to use the altera cable for xilinx parts, but I'd vote for giving programming it from the avr a try.
Generally there are two options for how to do this, depending a bit on the capabilities of your embedded system (especially if it has something approximating a "disk") and it's data channels to the outside world.
For small micros, I've tended to go with building some sort of "jtag adapter" mode into the firmware. The PC runs a modified open-source jtag (or whatever) "player" program which sends low level commands over the serial/usb/etc channel to the micro which twiddles the actual wires. This could be something very primitive like a hex-encoded nibble indicating the state of the wires. However, doing it that way can be very slow, especially if it results in single-byte transfers on a usb-serial adapter. A faster approach may be to look at the structure of the player software and move the loop responsible for some unit of jtag data transfer into the embedded device, in order to run the pc-micro channel in larger packets. Or possibly have the player software queue up operations and hand them off in a batch. This tends to work fairly quickly for raw program operations, but slowly for verify ones where you have to stall on the double latency of the pc-micro communications channel every time you "read".
For larger systems, for example something running an embedded linux, you can often just port a bit-bang type player application to the embedded system, ftp the programming data file over, and run it there much as you would on a PC with a simple jtag dongle.