WinEvents is the way to go here. The API you need is SetWinEventHook() - if you care about a specific window, use GetWindowThreadProcessId() to get the HWND's threadId and then listen to events only from that specific thread. For window title changes, you'll want the EVENT_OBJECT_NAMECHANGE event.
You can hook either "in context" or "out of context" - the latter is the simplest, and means the event gets delivered back to your own process, so you don't need a separate DLL - which makes it possible to do it all in C#; but the thread that calls SetWinEventHook must have a message loop (GetMessage/TranslateMessage/DispatchMessage), since the events are delivered using a form of messages behind the scenes.
In your WinEvent callback, you'll need to check that the HWND is the one you care about, since you'll get name changes for any UI on that target thread, possibly including child window name changes, or other things you don't care about.
--
By the way, you can check this answer for some sample C# code that uses WinEvents; it's using them to track foreground window changes across all windows on the desktop; but should just take a few simple modifications outlined above to track name changes on a specific window.