Thanks TCBarrett. I found a similar article here: https://wp.tutsplus.com/tutorials/creative-coding/how-to-use-radio-buttons-with-taxonomies/ There was some good info in the comments that helped me out.
Here is my final code, to make a non-hierarchical custom taxonomy named ‘mens_rings’ display in the admin like categories would, for the custom post type ‘product’:
add_action( 'add_meta_boxes', 'gpj_change_meta_box');
function gpj_change_meta_box() {
remove_meta_box('tagsdiv-mens_rings', 'product', 'normal');
add_meta_box( 'gpj-mens_rings', 'Men\'s Rings','gpj_mytaxonomy_metabox','product' ,'side','core');
}
function gpj_mytaxonomy_metabox($post) {
$taxonomy = 'mens_rings';
// all terms of ctax
$all_ctax_terms = get_terms($taxonomy,array('hide_empty' => 0));
// all the terms currenly assigned to the post
$all_post_terms = get_the_terms( $post->ID,$taxonomy );
// name for each input, notice the extra []
$name = 'tax_input[' . $taxonomy . '][]';
// make an array of the ids of all terms attached to the post
$array_post_term_ids = array();
if ($all_post_terms) {
foreach ($all_post_terms as $post_term) {
$post_term_id = $post_term->term_id;
$array_post_term_ids[] = $post_term_id;
}
}
?>
<div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
<input type="hidden" name="<?php echo $name; ?>" value="0" />
<ul>
<?php foreach($all_ctax_terms as $term){
if (in_array($term->term_id, $array_post_term_ids)) {
$checked = "checked = ''";
}
else {
$checked = "";
}
$id = $taxonomy.'-'.$term->term_id;
echo "<li id='$id'>";
echo "<input type='checkbox' name='{$name}'id='in-$id'"
. $checked ."value='$term->slug' /><label> $term->name</label><br />";
echo "</li>";
}?>
</ul>
</div>
<?php
}