How could processes share memory in early versions of Unix? How does this compare with modern implementations of shared memory?
Very early UNIX systems did not have MMUs, and so effectively, all memory in the system was shared between all processes in memory. UNIX V7 was the first one that had memory management, AFAIK. The PDP-11 did not even have a MMU when it was released; see this PDF book, page 35.
As time moved forward and MMUs became a commonplace thing, UNIX began to require it. And then memory could be separated between processes. In the 1980s we saw more IPC mechanisms, including shared memory managed by the OS (which was new in SVR1, circa 1983). SVR1 also introduced messages and semaphors, and the System V APIs are still available on modern systems for all three of these things.