Hehe, tranquilo que eso siempre pasa.
Ok, bueno, vas a tener que usar ambos, un subproceso que siempre esté pendiente del irc, lo mejor es que lo hagas en una clase que abstraiga el hecho de que hay un subproceso corriendo, esa clase tiene que tener un método Start o Connect, para comenzar la connection, además, antes de connectarte tienes que subscribirte a los métodos de la clase que son los que van a darte los resultados.
No es muy difícil, puedes tener un evento de DataReceived, o algo así, con un argumento en donde esté todo bien parseado sobre la data recibida. Por ejemplo, qué tipo de mensaje es, si es privado o no, de qué usuario proviene, todo eso,para así no estar parseando ni procesando la data en el formulario. Te suscribes a ese evento en el formulario y ya.
Luego un método para escribir al IRC, un método que te liste los usuarios, o los channels a los que estás unido, otro que traiga todos los channels del server,.
Hay mucho tema, pero comienza poco a poco y le vas añadiendo funcionalidades.
Si tienes dudas sobre Threading o sobre Delegados, hay temas en el foro, puedes buscar en google con algo así:
site:elhacker.net Delegados OR Delegates
Un saludo!