> The shell sends the data to the terminal through the STDOUT side of the pty
Unless redirected, ls inherits the pty file descriptor from the shell¹ when the shell forks it. But after that, it's writing to the terminal emulator directly, not to the shell; that is, the shell doesn't forward `ls -l`'s output to the terminal.
¹(or really, the child inherits whatever file descriptor the shell has for stdin, stdout, stderr for its stdin, stdout, stderr, respectively, unless, for each of those, there is a redirection specified, in which case the shell replaces the file descriptor in the child as specified by the command give to the shell. stdin/stdout/stderr might be a pty in the shell, or they might not be.)
> The terminal emulator is a graphical application whose role it is to interpret data coming from the shell and display it on screen. This display is often textual but not always.
> The shell provides an interface to the operating system, allowing the user to interact with its file-system, run processes and often have access to basic scripting capabilities.
> These two programs are connected together by the pty (pseudoterminal) which provides a bi-directional asynchronous communication channel between the two.
You might also find the man pages wall(1) and write(1) (That's the terminal utility write, not the syscall write(2).) interesting.
(Edit: well, actually, if you're SSH'd into a remote host, your terminal emulator is probably local, so you might not be able to see into its memory unless you're root locally, ofc.)