For the first part of your question, I'd like to elaborate:
I can't figure out why you need an event to happen for sharing data from child to parent (@Output), while @Input() works fine for parent to child.
Because Angular has a uni-directional change detection system, from top to bottom.
This means changes in the parent are propagated to the child and not the other way around, by design, making the flow of application state easier to understand.
For binded properties (such as those decorated with @input) a change in value (for primitives) or reference (for objects) in the parent, will cause change detection to fire, and children will be updated with the new value or reference.
However, for example, reassigning the @input property in the child will not update the reference in the parent, as this would violate the top-down design aforementioned.
While there is a decorator for outputs, there isn't change detection from bottom to top, so changes in this direction must be explicitly told to the parent, e.g. with events, which is exactly what happens.
Further note
Despite all of this, it's still possible that changes to a binded property in a child will cause a change to be seen in the parent. This happens when an object reference is passed to the child and the child mutates the object using the reference, because, ultimately, it's still Javascript, and both parent and child have references to the same object. AND if something else causes change detection to fire in the parent, which updates the DOM and the effect of this mutation is observed on screen.
However, this code is hard to understand and debug, whereas @output is declarative and clear.