Currently, TestBuilder.Build() goes through and finds all inputs (parameters, constructor parameters, and Execute parameters,) and outputs (return types) and then cross-checks them all in order to make sure all test blocks have the required dependencies supplied by a prior test block.
It might make an appreciable difference in maintainability and readability in TestBuilder.Build() to instead handle that as part of AddTestBlock, AddAsyncTestBlock, AddFinallyBlock, and AddAsyncFinallyBlock.
Each TestBlock would need an Input and Output property. We don't really care (at that point) how the test block asks for the input; The DI service handles it for constructors, and there's already code to handle properties and execute args.