Let me give you a helpful framework to think about the problem. Let’s talk broadly about the main objects, since we have all used dialog systems.
First, there’s the individual lines. These are just strings, obviously, so putting them in a ScriptableObject is certainly reasonable.
Next there’s the notion of a given choice (node), such as:
Actor 1: “Where do you want to go?”
Actor 2: (the player) can respond:
→ “To Work”
→ “To Home”
→ “I am staying here.”
Now we need the notion of how those are combined to present a given dialog, so we’ll call that the “network” or the “tree” of choices.
Those three notions can be easily represented in static form in ScriptableObjects, linked either by some identifier, or else with references dragged into each other.
Now you need a manager that can process the network, and wait at each choice (node) for the response, then look in the network to decide where to go next based on input.
The manager can also present the current choice to the user, but it might be cleaner to just have a separate thing that presents it to the user, and also accepts input and passes it back to the manager. That way the PC version might accept input from a keyboard, but the console version would read a controller up/down and ACCEPT, for instance.
Does that help you reason about the parts you might need?