Okay, I feel like you might be asking one of two questions, so I will try to answer both.
What libraries can one use to create ncurses like interfaces for shell scripts?
Actually, I would never have recommended ncurses directly for shell scripts anyway since it's really not meant to be used by shell languages. Instead, I would recommend dialog. Dialog is a shim library which sits between ncurses and the shell making its use much simpler.
This would functionally give you two dependencies (one on ncurses and one on dialog) which you seem to be against for some reason.
Given that I don't want any external dependencies, how can I create my own ncurses-like TUI library?
This is way outside the scope of *nix.SE. Creating a new TUI library is not going to be trivial (particularly if you're trying to create it in pure shell). There have been plenty of projects to attempt making new libraries to replace some of the use of ncurses (e.g., termbox is one of the more successful ones).
If you intend to create your own library, you may want to look at the lower-level projects like ncurses and termbox and higher-level projects like dialog. Looking at their work might give you an idea of how to get started.
A final recommendation:
Dependencies on external projects, though they require some extra work (for integration and support), are not a bad thing. It means that you can focus only on the tool you want to make and leave the ground-work to those doing the lower infrastructure. Linux, in particular out of the *nix platforms, has a long history of dependency interaction.
If your goal is to learn how the lower-level stuff is done, great go for it. If instead you're trying to make a tool that would benefit from such low level work, just depend on an external tool. You'll be happier and so will be everyone that looks at your code.