Why? Because this gives you read / write access to both pattern tables (8K), and all four name tables (4K, no mirroring), from outside of the NES. You could then use the Arduino to dynamically update tile data / attributes on-the-fly for example, while the NES does its reads / writes from the other side of the dual-port RAM!
The PRG data is stored in the Arduino's flash memory and uploaded to the dual-port PRG-RAM on start-up. There is only one XMEM interface on the Arduino though, so PRG-RAM is written sequentially all in one go, using two SN74HC590A 8-bit binary counters to increment through the addresses being written, ascending in order. So it is possible to update PRG data on-the-fly as well, but only using 'sequential access' - not 'random access'. PRG doesn't have to be dual-port RAM though, it could just be an EEPROM. But, this certainly made testing simpler! I am using a 16K chip at the moment (NROM-128), but it could be swapped out for a 32K chip (NROM-256) easily - the extra signals are already connected.
As a demonstration / proof-of-concept I decided to try using the pattern tables as a 256x128 screen buffer. I took some games written for the Arduino-based 'Arduboy' console, and re-wrote the display routines to output the screen buffer as NES tiles, continually updated directly into CHR-RAM - all the NES has to do is read and display the same set of tiles over and over (I also needed to add in a sprite-zero hit half way down to switch pattern tables, so I could get all 512 tiles on screen at once).
The sound is just a square wave from a single Arduino pin, going through a 270K resistor into EXP6 on the cartridge port, and then through the usual 47K resistor from EXP6 to 'Audio-In' underneath on the NES expansion port.
There is definitely more information to be explained here, and I am happy to answer questions, but for now I am just really excited to actually have a proof-of-concept that I can share!