```python
def trace_parcel(events: list) -> list:
    if not isinstance(events, list):
        raise ValueError("Input must be a list.")

    states = ["created"]
    for event in events:
        if event not in ["created", "packed", "shipped", "delivered", "returned"]:
            raise ValueError(f"Invalid event: {event}")

        if event == "created" and states[-1] != "created":
            raise ValueError("Cannot transition from 'created' to 'packed' without intermediate 'created' state.")

        if event == "packed" and states[-1] != "packed":
            raise ValueError("Cannot transition from 'packed' to 'shipped' without intermediate 'packed' state.")

        if event == "shipped" and states[-1] != "shipped":
            raise ValueError("Cannot transition from 'shipped' to 'delivered' without intermediate 'shipped' state.")

        if event == "delivered" and states[-1] != "delivered":
            raise ValueError("Cannot transition from 'delivered' to 'returned' without intermediate 'delivered' state.")

        if event == "returned" and states[-1] != "returned":
            raise ValueError("Cannot transition from 'returned' to 'delivered' without intermediate 'returned' state.")

        states.append(event)

    return states
```