<p>I have a WinForms app with an input textbox, button, and a multiline output textbox.
A root path is entered in the textbox.  Button click calls a function to recursively check all subdirectories for some proper directory naming validation check. 
The results are output into the multiline textbox.</p>

<p>If the recursive work is done in a separate class, I have two options:</p>

<ol>
<li><p>Keep track of improper directories in a class property(e.g. ArrayList),return the ArrayList when done, and update the output textbox with all results.</p></li>
<li><p>Pass in ByRef the output textbox and update/refresh it for each improper directory.
Even though 1 &amp; 2 are single-threaded, with 2, I would at least get my results updated per directory.</p></li>
</ol>

<p>If the recursive work is done in the presentation layer and the validation is done in a separate class, I can multithread.</p>

<p>Which is a cleaner way?</p>

You don't need to pass the TextBox ByRef.  It's already a reference object.  Passing it ByRef would only have an effect if you planned to assign a different or new TextBox to the reference.
If you're going to do the work in a separate class, it seems as simple as passing in the contents of the TextBox as a string, and getting the results back as a string or a set of strings (array or
```
List<string>
```
or the like).  This is better than passing in the TextBox in case someday you decide to use a different kind of control to store this information.