As @MattLacey said, use the apex:facet inside of an apex:column.
Once you do that, you can either write the implementation of the checkAll / uncheckAll to be strictly client side with JavaScript or you can use built-in Visualforce for everything.
Client Side (JavaScript)
You could use jQuery or just plain old JavaScript to implement a checkAll / uncheckAll that is strictly client side.
The checkbox in that case would not need to be an apex:inputCheckbox. You could just use a plain old HTML checkbox.
<apex:column >
<apex:facet name="header">
<input type="checkbox" id="checkAllBox" onclick="toggleCheckAll(this)"/>
</apex:facet>
<apex:inputCheckbox value="{!wrappedItem.checked}"/>
</apex:column>
And the JS:
var $j = jQuery.noConflict();
function toggleCheckAll(checkAllBox) {
$j('.checkableTable :checkbox').prop('checked', checkAllBox.checked);
}
Server Side (Pure Visualforce / No JavaScript)
If you want a pure Visualforce solution where the checkbox is an apex:inputCheckbox that when checked/unchecked invokes an action in the controller to check all of the wrapped items and redisplay them then you'd want something like this:
<apex:column >
<apex:facet name="header">
<apex:inputCheckbox value="{!checkAllValue}" reRender="myWrappers">
<apex:actionSupport event="onchange" rerender="theBlock" action="{!processCheckChange}"/>
</apex:inputCheckbox>
</apex:facet>
<apex:inputCheckbox value="{!wrappedItem.checked}"/>
</apex:column>
You'll have to write the processCheckChange method to set the value of the wrappedItems checked.
In my opinion, the JavaScript solution is usually preferable, since you don't want your users to have to experience the lag of a round trip to the server to check / uncheck all boxes.
In answer to question number 1 about the conditional rendering
You could either filter the list directly in the controller to remove the unchecked items or you could use the rendered attribute of apex:column. For example:
<apex:column rendered="{!w.checked}">
<input type="checkbox" />
</apex:column>
<apex:column value="{!w.school.Name}" rendered="{!w.checked }" />
<apex:column value="{!w.school.OtherField}" rendered="{!w.checked}"/>
If you have to do that it would be better to use the native Visualforce (no JavaScript solution).