Premesso che ho realizzato un software del genere (con molti processi relativi a codice C/C++ che acquisivano dati ad alta velocità e un programma in C#, altro processo, che li gestiva tramite memoria condivisa), le cose non sono semplicissime, anzi.

1) perche la memoria condivisa e non i socket
due processi si scambiano grandi quantità di dati e la lettura devono essere molto veloci, e parliamo di software in contesti dove la sicurezza è un requisito ad alta priorità, gestione di un impianto industriale in real time.
Ho molte perplessità :

a) Windows (e le relative applicazioni) non è un sistema operativo "real time" e i tempi di elaborazione non sono deterministici. E' comunque un sistema soggetto a ritardi imprevedibili che possono pregiudicare certi tipi di lavoro;

b) in ogni caso il sistema è esposto a malfunzionamenti di qualsiasi genere (non ultimi, crash del sistema operativo) e quindi non è affatto adatto in un ambiente industriale critico (dovresti usare sistemi appositamente progettati e dedicati al mondo industriale)

c) per lo scambio di dati in memoria condivisa tra due processi, devi implementare un sistema "robusto" di sincronizzazione, in modo che il processo "consumatore" non legga dati che non sono ancora stati scritti totalmente o che non riesca a "star dietro" al produttore. Dovrai quindi avere a che fare con mutex, semafori e affini.

immagina questo un processo legge dei dati da alcuni sensori che regolano il funzionamento di un macchinario, e li devi inviare ad una macchina che supervisiona il lavoro,
Dipende dalla velocità di acquisizione dei dati e dalla loro quantità.
Nel software di cui ti parlavo e che ho scritto per delle misurazioni industriali, l'acquisizione era molto veloce.

ma se io "volessi"
separare lettore e scrittore su due form diverse??
Due form o due processi?

E' differente ...

In ogni caso, cosa hai scritto ? Hai già del codice che non funziona ?